#ifndef __GC_H__
#define __GC_H__

#include "redobject.h"

#define TO_GC(o)						(((gc_head_t *)(o)) - 1)
#define FROM_GC(o)						((RedObject *)((o) + 1))

#define GC_UNTRACK						-1
#define GC_REACHABLE					-2
#define GC_UNREACHABLE					-3

#define RedObject_GC_IsTracked(o)		(!(((RedObject *)(o))->ob_flags & RED_OBJECT_STATIC) && (TO_GC(o)->gc_ref != GC_UNTRACK))

typedef struct _gc_head_t gc_head_t;
typedef struct _gc_head_t
{
	int			 gc_ref;
	size_t		 gc_size;
	gc_head_t	*gc_prev;
	gc_head_t	*gc_next;
} gc_head_t;

RED_EXPORT void Red_FreeGarbageCollector(void);
RED_EXPORT void Red_InitGarbageCollector(void);

RED_EXPORT int RedObject_GC_Collect(void);

RED_EXPORT void RedObject_GC_Insert(RedObject *object);
RED_EXPORT void RedObject_GC_Remove(RedObject *object);

RED_EXPORT void RedObject_GC_Free(RedObject *object);
RED_EXPORT RedObject *RedObject_GC_Alloc(size_t size);

#endif /* __GC_H__ */
